ミュンヘンのAWSイベントに参加してLambdaのペイロード制限に関する勘違いに気づいた話。
去る2023年9月14日、ドイツはミュンヘンでAWSのコミュニティイベント、AWS Community Day DACH 2023 に参加してきました。
AWS Community Day DACH 2023@ミュンヘン参加してきた
イベントの概要や当日のレポートは同僚が書いてくれてます。
生のイベントは熱があっていいですね。
参加したセッション
色々と面白く、主にサーバレス周りのセッションを周ったのですが、特に「AWS サーバレスサービスのサービスクォータ」に関するセッションが印象的でした。
セッション概要
Making sense of service quotas of AWS Serverless services and how to deal with them
There is a misunderstanding, that everything is possible with the Serverless Services in AWS, for example that your Lambda function may scale without limitations . But each AWS service (not only Serverless) has a big list of quotas that everybody needs to be aware of, understand and take into account during the development.
In this talk I'll explain the most important quotas of the Serverless Services like API Gateway, Lambda, DynamoDB, SQS and Aurora Serverless and how to architect your solution with these quotas in mind.
内容はLambda, API GatewayのQuotaの解説、実案件でつまづきがちな場面の紹介など。
最近ちょうど、AWS外で管理された10MBを超えるテキスト群をLambdaに送って処理させたいケースがあったのですが、Lambdaには呼出時の6MBペイロード制限があります。
イベント終了後、スピーカーのVadym Kazulkin氏に、その迂回案について相談をさせてもらいました。
回答:「API Gatewayなどエンドポイントを通じてStreaming backしない限り、ペイロードは気にしなくて大丈夫では?」
Lambdaへのリクエスト内に無理にテキストを含めるのではなく、Lambda側からその外部ファイルを取得させればいい、ということです。
...確かに。
つまり...
- 外部からのリクエストやEventBridgeなどでLambdaを起動する
- Lambda関数内から外部のアセット(テキストファイルなど)にリクエストを送る
- 2のレスポンスをLambdaでそのまま処理(その後S3へ保存、など)
上記の流れであれば、特にペイロード制限を気にせずできるはずだということで、試してみました。
試したこと
外部からアクセス可能な 約25MB のファイルを用意して、LambdaからGETしてみました。
- Python 3.9
- タイムアウトは 10s に変更
コード
import requests def get_file(asset_url): try: response = requests.get(asset_url) print("Content:", response.text[:200]) return response.status_code except Exception as err: print(err) def lambda_handler(event, context): url = "https://ASSET_URL_HERE" return get_file(url)
結果
__Response__ 200 __Function Logs__ START RequestId: 184c9146-eef6-41a5-9832-f83d038a9f19 Version: $LATEST Content: Lorem ipsum dolor sit amet, consectetur ...
いけました。
つまりLambdaの6MBのQuotaは、API Gateway や Lambdaエンドポイントを通じて「Lambda関数にリクエストを送る際やレスポンスのペイロード」が対象であって、 Lambdaから外部エンドポイントへリクエスト(Lambda→外部)を行い、受け取るレスポンスに対しての制限はないようです。
文章にしてみるとそうなのですが、今まで無意識に勘違いをしていました(もちろん /tmp
ストレージ、エンドポイントを通じたレスポンスなどは注意が必要ですが)。
なので、
- Lambdaから外部アセットを取得してS3にコピー or 圧縮
- Lambdaで(20MB以上でも)ファイルを複数取得して別ファイル生成
みたいなことは普通にできるんですね。
ペイロード制限を超えそうなテキストなどは、逆にLambdaからアクセスできるようにしておけば、無理に全てリクエストに持たせる必要がないということで、自分の中でLambdaで実現できることの幅が広がりました。
イベントの感想
イベントはめちゃくちゃ活気があるし、無料だし、Tシャツももらえてケータリングも充実していて、言うことナシです。
AWSプロ/専門資格持ちの方にとっては既知の情報も多いと思われるため、むしろ会場でのネットワーキングが大事かも、というのは感じました。
もったいない精神で全時間帯セッションに参加して疲れ果てた自分ですが、ランチタイムとセッションも被ってますし、うまいこと余力を残して、スピーカーや参加者と話したほうが実りがありそうです(と1日の終わりに気づく)。
ちなみにイベント名の「DACH」とは下記三国の略とのこと。恥ずかしながら今まで知らなかった...
- D — Deutschland (ドイツ)
- A — Austria (オーストリア)
- CH — Confœderatio Helvetica (スイス)